1. 两数之和

1. 两数之和

题目链接
代码随想录

分析

一开始的时候,我想到的是两层 for 循环,但是这样不符合题目的要求,因此,我们得想个办法,用这个办法跳过已经算过的组合,这样复杂度就不是 O(nn)
后来我放弃了,还是想用双指针法,然后想到了一个思路,先对数组进行排序,然后用双指针查找元素,slow 索引的初始值是 0,fast 的初始值是 nums.length-1,如果两指针指向的数字之和小于目标值,就向右移动 slow ,大于目标值,就向左移动 fast,如果两个指针相遇,就跳出循环,这样确实是可以找到目标元素(甚至可以找到所有和为 target 的目标元素组合),但是题目要求的是返回元素的下标,而不是元素本身,因此这个做法泡汤了。

后面在 15. 三数之和 我们会重试这种方法

看题解,题解的做法其实就是,在遍历过的元素中寻找另一个值,这样,其实就是把双层 for 循环解法中内部的那个循环,变成了一个 hash 表查询,复杂度为 O(1),这也非常贴合我们在 哈希表 中强调的,哈希表是为了解决如何快速判断一个元素是否出现集合里。因此,哈希表确实也解决了我们在最开始的双层 for 循环思路中想要解决的问题

解题

public int[] twoSum(int[] nums, int target) {
    HashMap<Integer,Integer> scaned = new HashMap<>();
    for(int i=0;i<nums.length;i++){
        int numNow = nums[i];
        Integer anotherIndex = scaned.get(target-numNow);
        if(anotherIndex==null){
            scaned.put(numNow,i);
        }else{
            return new int[]{anotherIndex,i};
        }
    }
    return null;
}

相关题

进阶版
454. 四数相加 II
15. 三数之和
18. 四数之和